DockerでLaravel動かす


概要

まずToDoをまとめると、

・Docker入れる

・適当にphpとMySQLのimage用意する

・それらのコンテナ起動

・phpコンテナにLaravel入れる

・適当なLarabelプロジェクト作る

・アクセス


参考。

http://qiita.com/kukimo/items/c044ad42fffac062e2f5

絶対に絶対にPHP書きたくないがなんか特定の認証について知りたいのでやってみる。



Lamp環境入れる

docker run -p 80:80 --name php -d php:5.6-apache

こんな感じで。

Apacheっていうのが気にくわんがまあいいや。


起動しているプロセスの情報は、docker ps -a で確認できる。


Docker内のフォルダをhostとshareする

できるっぽいな?

っていうかそれできないと辛くてな。

-> exec コマンドがあるおかげで、なんか楽になってるっぽいぞ。ふむ?

http://stackoverflow.com/questions/25446055/how-to-edit-a-file-dynamically-in-a-running-docker-container?noredirect=1&lq=1

-> Dockerから手元のフォルダを指す方法があった。これでいいな、、、

手元に適当なフォルダを作り、

 /Users/tartetatin/Desktop/LaravelServer


docker run で、コンテナ内の特定のパスを、ホストの特定のパスと接続する。

docker run -p 80:80 -v /Users/tartetatin/Desktop/LaravelServer:/var/www/html --name php -d php:5.6-apache

これで、/var/www/htmlはapacheのデフォルトのドキュメントルートなので、ホストからDockerへのhttpリクエスト時に手元のフォルダが差されるようになった。

楽ジャーーーーン。



ホスト<->コンテナ間のファイルコピー

http://qiita.com/gologo13/items/7e4e404af80377b48fd5

双方向でできるようになってた。

わーーーい!!



コンテナを起動する

nameがかぶるんで、古いやつを適当に消さないといけない感じがする。

nameの概念を忘れた。なんだっけ、、


name -> imageから作成されたcontainerにつけられてるid。

containerはimageから生成され、起動中/終了中 などの状態を持っているので、nameで個々を区別する。


docker start name


で、すでに作成されたコンテナを起動できる。


docker run -> imageからcontainerを作る

docer start/stop container -> containerを起動したり停めたり

containerを指定するには、nameをつけておくといいよねっていう感じ。



作成したコンテナにTerminalで入る

docker exec -ti mysql bash

なんかかなり楽になってない? いいね~~



Dockerfile作ってPHPの入ってるコンテナを作り直す

適当なパスにDockerfile作る。


touch /Users/tartetatin/Desktop/LaravelServer/Dockerfile


Dockerfile

FROM php:5.6-apache

RUN apt-get update && docker-php-ext-install pdo_mysql mysqli mbstring


zip入れてcomposer入れてcomposerを移動してる。


それを元に、新たにPHPコンテナ立ち上げ。


docker build -t php:custom /Users/tartetatin/Desktop/LaravelServer/

なるほどな~~これで特定のimageをもとに、特定の構成で立ち上げられるimageが作成される。



MySQLの言語設定をUTF-8にして立ち上げる

なんか世知辛い事情によって、MySQLの文字コードはデフォルトではLatinらしい。

で、/Users/tartetatin/Desktop/LaravelServer/mysql/conf.dを作っておいて、MySQLの起動時に呼ばれるファイルの代わりに読み込ませる。


docker run --name mysql -v /Users/tartetatin/Desktop/LaravelServer/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7



PHPとMySQLのコンテナを立ち上げて協調動作させる

先ほど作ったphp:customと、mysql:mysql を協調動作させる。

MySQLのコンテナはlinkで立ち上がるわけでは無いみたいだ。事前に立ち上げておかないといけないのか、、なんか方法がないのかな。


docker run -p 80:80 -v /Users/tartetatin/Desktop/LaravelServer:/var/www/html --link mysql:mysql --name php -d php:custom


で、立ち上がっているコンテナ一覧は、

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES

fd0ee19fa1f2        php:custom          "apache2-foreground"     2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   php

aa9bed662161        mysql:5.7           "docker-entrypoint.sh"   24 minutes ago      Up 24 minutes       3306/tcp             mysql

いい感じっぽい。

MySQLは動いてるんだろうか?

php:customで作ったコンテナに入って、/etc/hosts/を確認してみると、MySQLの情報があるっぽい。


docker exec -ti php bash

cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 mysql 2df3c79ac7b2

172.17.0.3 <phpが動いてるコンテナのID>


ふむふむ。mysql含まれてるからいいっぽい。


composerインストール

phpの依存関係とかをアレするツールとして、composerをphpコンテナに入れる。

どうやんの。

この辺を参考に。

https://kore1server.com/175


curl -sS https://getcomposer.org/installer | php

mv composer.phar /usr/local/bin/composer

あとunzipとか入ってねえな、、、要る。

apt-get install zip

これY/nでるんで困ってるんだけどDockerfileとかで自動化するにはどうすればいいの。


Laravelでの最初のプロジェクト作り

composer global require "laravel/installer=~1.1"

composer create-project laravel/laravel MyFirstLaravel


行けたっぽさがある。


で、とりあえずMySQLとかの設定をしないといけないが、無視してアクセスしてみよう。

127.0.0.1では、Apacheの設定を放置したままなのでforbiddenが見えてる状態。


で。ここから、設定を変更していく。

・Apacheのデフォルトを、Laravelのデフォルトパスへと変更

・MySQLのIPの指定



設定はMyFirlstLaravelのフォルダにあるっぽい

.envファイルがそれ。


まず、ホストからLaravelのindexにアクセスできるようにしてみよう。


Apacheのデフォルトアクセスパスを、Laravelのデフォルトを指すように変更する。

apacheの該当設定のconfは以下にあるはず。

/etc/apache2/sites-available/000-default.conf


このファイルを一度hostへとコピーして、もう一度コンテナへとコピー。


docker cp <phpが動いてるコンテナのID>:/etc/apache2/sites-available/000-default.conf /Users/tartetatin/Desktop/LaravelServer/apache2/000-default.conf


で、コピッてきたconfの該当行を書き換える。


DocumentRoot /var/www/html/MyFirstLaravel/public



編集したファイルをコピーでHost -> Containerへと戻して、

docker cp /Users/tartetatin/Desktop/LaravelServer/apache2/000-default.conf <phpが動いてるコンテナのID>:/etc/apache2/sites-available/000-default.conf


phpの動いてるコンテナで、apacheの再起動

apachectl -k graceful


これで、apacheへとアクセスした時に、Laravelのパスへとアクセスできるようになった。

127.0.0.1にアクセスすると、確かにいい感じにインデックス表示された。まだMySQL動いてないんだけど。

スクリーンショット 2016-10-10 17.33.10.png

このコンフィグいじるとかその辺もなんかDockerfileに書き込めるといいんだろうなあ。と思うが面倒臭いのでいい。


MySQLの設定

次に、MySQLのパスを指定してみる。どうせなんか必要なんだろうし。、、必要なのか?

laravelの.envを書き換えればいいんだと思う。まあ面倒だから一度この辺で帰ろう。